from book.models import BookInfo, PeopleInfo
BookInfo.objects.get(id=1)
BookInfo.objects.get(id=5)

BookInfo.objects.all()


BookInfo.objects.count()

PeopleInfo.objects.count()


"""
实现SQL中的where功能，包括：
     - filter过滤出多个结果
     - exclude删除掉符合条件剩下的结果
     - get过滤单一结果
对于过滤条件的使用，上述三个方法相同，故仅以filter进行讲解。

过滤条件的表达语法如下：
    属性名称__ 比较运算符=值
    属性名称和比较运算符间使用两个下划线，所以属性名不能包括多个下划线
"""
#1
BookInfo.objects.get(id__exact=1)

BookInfo.objects.get(id=1)
BookInfo.objects.get(id=1)
BookInfo.objects.get(pk=1)
#2
BookInfo.objects.filter(name__contains='传')
BookInfo.objects.filter(name__endswith='部')
BookInfo.objects.filter(name__startswith='射')
#3
BookInfo.objects.filter(name__isnull=True)
BookInfo.objects.filter(name__isnull=False)
#4
BookInfo.objects.filter(id__in=[1,3,5])
#5
"""
     gt大于(greater then)
     gte大于等于(greater then equal)
     lt小于(less then)
     lte小于等于(less then equal)
"""

BookInfo.objects.filter(id__gt=3)
BookInfo.objects.filter(id__lte=2)

BookInfo.objects.exclude(id=3)
#6
BookInfo.objects.filter(pub_date__year=1980)
#列
BookInfo.objects.filter(pub_date__gt='1990-1-1')


#二
"""
1.F对象
     之前的查询都是对象的属性与常量值比较，两个属性怎么比较呢？ 答:使用F对象，被定义在django.db.model中。
     
语法如下：
    F(属性名)
例：查询阅读量大于等于评论量的图书。
"""
#导包
from  django.db.models import F, Q
BookInfo.objects.filter(readcount__gte=F('commentcount'))

#查询
BookInfo.objects.filter(readcount__gte= F('commentcount')*2)

"""
2. Q对象
    多个过滤器逐个调用表示逻辑与关系，同sql语句中where部分的and关键字。
"""
#例
BookInfo.objects.filter(readcount__gt=20, id__lt=3)

BookInfo.objects.filter(Q(readcount__gt=20) | Q(id__lt=3))

#查询
BookInfo.objects.filter(~Q(id=3))
BookInfo.objects.filter(~Q(id__in=[1,3]))

#三
#1.
from django.db.models import  Sum, Max, Avg, Count, Min
BookInfo.objects.aggregate(Sum('readcount'))
BookInfo.objects.aggregate(Max('commentcount'))
BookInfo.objects.aggregate(Avg('readcount'))

#2. 排序
BookInfo.objects.all()
BookInfo.objects.all().order_by('readcount')
BookInfo.objects.all().order_by('-commentcount')
BookInfo.objects.all().order_by('pub_date')
BookInfo.objects.all().order_by('-pub_date')


#四
#1.关联查询
#1.1
book = BookInfo.objects.get(id=1)
book.peopleinfo_set.all()

#例
book = BookInfo.objects.get(name='雪山飞狐')

#1.2
people = PeopleInfo.objects.get(id=1)
people.book

#1.3
people.book_id

#例
people = PeopleInfo.objects.get(name='虚竹')
people.book


#2
#2.1
"""
语法如下:
      关联模型类名小写__属性名__条件运算符=值
注意：如果没有"__运算符"部分，表示等于。
"""

book = BookInfo.objects.get(peopleinfo__name='郭靖')

books = BookInfo.objects.filter(peopleinfo__description__contains='八')


#2.2
"""
语法如下：
    一模型类关联属性名__一模型类书姓名__条件运算符=值
注意：如果没有"__运算符"部分，表示等于。
"""

peoples = PeopleInfo.objects.filter(book__name='天龙八部')

peoples = PeopleInfo.objects.filter(book__readcount__gt=30)